import asyncio
# python 的 Coroutine 相当于 rust 的 Future
async def delay(msg, sec):
    await asyncio.sleep(sec)
    print(msg)
    return msg

async def demo_join():
    print('--- asyncio.gather (join) ---')
    await asyncio.gather(
        delay('task1 done', 1),
        delay('task2 done', 1.5)
    )
    print('all tasks done')

async def demo_race():
    print('--- asyncio.wait (race) ---')
    tasks = [
        asyncio.create_task(delay('task1 done', 1)),
        asyncio.create_task(delay('task2 done', 0.5))
    ]
    # asyncio.ALL_COMPLETED等待所有任务都完成（无论正常完成还是异常），这是默认值。
    # asyncio.FIRST_EXCEPTION只要有任何一个任务抛出异常，wait 就会立即返回（如果没有异常，则等到全部完成）。
    # asyncio.FIRST_COMPLETED只要有一个任务完成（正常或异常），wait 就返回。
    done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
    print('one task done')
    # 可选：取消未完成的任务
    for task in pending:
        task.cancel()

async def main():
    # await demo_join()
    await demo_race()

asyncio.run(main())


